package com.zzw.springboot.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * Redis分布式锁工具类
 */
@Component
public class RedisLockUtil {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    // 锁前缀
    private static final String LOCK_PREFIX = "lock:";
    // 默认锁过期时间（秒）
    private static final long DEFAULT_LOCK_TIMEOUT = 30;

    /**
     * 尝试获取锁
     *
     * @param lockKey 锁键
     * @param value   锁值（通常使用请求ID或线程ID）
     * @param timeout 锁超时时间（秒）
     * @return 是否获取成功
     */
    public boolean tryLock(String lockKey, String value, long timeout) {
        String key = LOCK_PREFIX + lockKey;
        // 使用setIfAbsent（对应Redis的SETNX命令） 如果没有就创建
        Boolean result = redisTemplate.opsForValue().setIfAbsent(key, value, timeout, TimeUnit.SECONDS);
        return result != null && result;
    }

    /**
     * 释放锁（需要确保只有持有锁的线程才能释放锁）
     *
     * @param lockKey 锁键
     * @param value   锁值
     * @return 是否释放成功
     */
    public boolean  releaseLock(String lockKey, String value) {
        String key = LOCK_PREFIX + lockKey;
        Object currentValue = redisTemplate.opsForValue().get(key);
        if (currentValue != null && currentValue.toString().equals(value)) {
            return redisTemplate.delete(key);
        }
        return false;
    }

    /**
     * 尝试获取锁（使用默认超时时间）
     *
     * @param lockKey 锁键
     * @param value   锁值
     * @return 是否获取成功
     */
    public boolean tryLock(String lockKey, String value) {
        return tryLock(lockKey, value, DEFAULT_LOCK_TIMEOUT);
    }
}
